#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<sys/mman.h>
#include<stdio.h>
#include<errno.h>
//具有血缘关系的 进程间通信
int main(int argc,char** argv)
{
    char*p=NULL;
    int fd;
    fd=open("ipc_mmap.txt",O_RDWR|O_CREAT|O_TRUNC);

    if(fd==-1)
    {
        
        perror("open fail\n");
        }

   //拓展文件size
   int size;
   lseek(fd,1000,SEEK_END);
   write(fd,"\0",1);//实际长度是1000

   //计算扩展文件大小
   size=lseek(fd,0,SEEK_END);

   p=mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
   close(fd);//创建成功mmap即可 close fd；
   if(p==MAP_FAILED)
   {
       
       perror("mmap fail!\n");
       }
    
    //IPC communication
    pid_t pid=fork();//创建子进程

    if(pid<0)
    {
        perror("fork fail!\n");

        exit(1);
        }

    else if(pid==0)
    {
        //子进程，进行共享映射区域的修改（write）
        strcpy(p,"hello ubuntu!\n");
        write(STDOUT_FILENO,p,strlen(p));
        printf("--------child fork is finish!\n");
        }
        else if(pid>9)
        {
            //父进程
            sleep(2);//确保子进程完成对mmap区域的修改
            //从mmap区域进行读操作
            printf("father read mmap:p=%s\n",p);
            wait(NULL);//回收子进程
            printf("-------father is finish!\n");



            }
        int flag=munmap(p,size);





return 0;
}
